#ifndef _LOG_H
#define _LOG_H

#include <stdio.h>

#define LOG_ANSI_COLOR_ENABLE   1 //颜色打印信息开关


#define LOG_LEVEL_VERBOSE   0  
#define LOG_LEVEL_INFO      1   //正常的打印信息
#define LOG_LEVEL_WARNING   2   //打印警告及以上信息
#define LOG_LEVEL_ERROR     3   //打印错误及以上信息
#define LOG_LEVEL_FATAL     4   //打印致命错误
#define LOG_LEVLE_OFF       5   //打印信息关闭


#define LOG_LEVEL   LOG_LEVEL_INFO  //打印等级

#if LOG_ANSI_COLOR_ENABLE
    #define LOG_ANSI_COLOR_RED      "\033[0;31m"
    #define LOG_ANSI_COLOR_BLU      "\033[0;34m"
    #define LOG_ANSI_COLOR_GRE		"\033[0;32m"
    #define LOG_ANSI_COLOR_YEL		"\033[0;33m"
    #define LOG_ANSI_COLOR_OFF		"\033[0m"
#else
    #define LOG_ANSI_COLOR_RED      NULL
    #define LOG_ANSI_COLOR_BLU      NULL
    #define LOG_ANSI_COLOR_GRE		NULL
    #define LOG_ANSI_COLOR_YEL		NULL
    #define LOG_ANSI_COLOR_OFF		NULL
#endif

#define my_printf           printf


#if LOG_LEVEL <= LOG_LEVEL_INFO
    #define LOG_INFO(_fmt_,...) \
        do{\
            my_printf("function():%s,line():%d",__FUNCTION__,__LINE__);\
            my_printf("[I]"_fmt_,##__VA_ARGS__);\
        } while (0)

    #define LOG_INFO_TAG(TAG,_fmt_,...) \
        do{\
            my_printf(LOG_ANSI_COLOR_GRE"function():%s,line():%d",__FUNCTION__,__LINE__);\
            my_printf("[INFO_TAG]"#TAG _fmt_,##__VA_ARGS__);\
            my_printf(LOG_ANSI_COLOR_OFF); \
        } while (0)
        
#else
    #define LOG_INFO(_fmt_, ...) \
	do{}while(0)

    #define LOG_INFO_TAG(TAG, _fmt_, ...) \
	do{}while(0)
#endif

#if LOG_LEVEL <= LOG_LEVEL_WARNING
     #define LOG_WARN(_fmt_,...)\
        do{\
            my_printf(LOG_ANSI_COLOR_BLU"function():%s,line():%d",__FUNCTION__,__LINE__);\
            my_printf("[WARN]"_fmt_,##__VA_ARGS__);\
            my_printf(LOG_ANSI_COLOR_OFF); \
        } while (0)


    #define LOG_WARN_TAG(TAG,_fmt_,...) \
        do{\
            my_printf(LOG_ANSI_COLOR_BLU"function():%s,line():%d",__FUNCTION__,__LINE__);\
            my_printf(#TAG"[WARN_TAG]" _fmt_,##__VA_ARGS__);\
            my_printf(LOG_ANSI_COLOR_OFF); \
        } while (0)



#else
    #define LOG_WARN(_fmt_, ...) \
	do{}while(0)

    #define LOG_WARN_TAG(TAG, _fmt_, ...) \
	do{}while(0)

#endif


#if LOG_LEVEL <= LOG_LEVEL_ERROR
     #define LOG_ERROR(_fmt_,...)\
        do{\
            my_printf(LOG_ANSI_COLOR_RED"function():%s,line():%d",__FUNCTION__,__LINE__);\
            my_printf("[ERROR]"_fmt_,##__VA_ARGS__);\
            my_printf(LOG_ANSI_COLOR_OFF); \
        } while (0)


    #define LOG_ERROR_TAG(TAG,_fmt_,...) \
        do{\
            my_printf(LOG_ANSI_COLOR_RED"function():%s,line():%d",__FUNCTION__,__LINE__);\
            my_printf(#TAG"[ERROR_TAG]" _fmt_,##__VA_ARGS__);\
            my_printf(LOG_ANSI_COLOR_OFF); \
        } while (0)



#else
    #define LOG_ERROR(_fmt_, ...) \
	do{}while(0)

    #define LOG_ERROR_TAG(TAG, _fmt_, ...) \
	do{}while(0)

#endif



#if LOG_LEVEL <= LOG_LEVEL_FATAL
     #define LOG_FATAL(_fmt_,...)\
        do{\
            my_printf(LOG_ANSI_COLOR_RED"function():%s,line():%d",__FUNCTION__,__LINE__);\
            my_printf("[FATAL]"_fmt_,##__VA_ARGS__);\
            my_printf(LOG_ANSI_COLOR_OFF); \
        } while (0)


    #define LOG_FATAL_TAG(TAG,_fmt_,...) \
        do{\
            my_printf(LOG_ANSI_COLOR_RED"function():%s,line():%d",__FUNCTION__,__LINE__);\
            my_printf(#TAG"[FATAL]" _fmt_,##__VA_ARGS__);\
            my_printf(LOG_ANSI_COLOR_OFF); \
        } while (0)



#else
    #define LOG_FATAL(_fmt_, ...) \
	do{}while(0)

    #define LOG_FATAL_TAG(TAG, _fmt_, ...) \
	do{}while(0)

#endif


#endif  /* __LOG_H__ */